package com.tjb.utils;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
 * @author tjb
 * @version 1.0
 * @date 2024/6/5 20:53
 */
@Component
public class CSVToTsFileUtil {
    static List<String> HeaderName = null;

//    public static void main(String[] args) throws IOException {
//        List<TsFileEntity> csv = parseCSV("C:\\SoftWare\\ProjectOfCode\\iotdb-master\\iotdb-master\\example\\jdbc\\src\\main\\java\\org\\apache\\iotdb\\csv.csv");
//        csv.forEach((s) -> System.out.println(s.toString()));
//        boolean b = readCSVToWriteTsFile(csv, HeaderName, "C:\\SoftWare\\ProjectOfCode\\iotdb-master\\iotdb-master\\example\\jdbc\\src\\main\\java\\org\\apache\\iotdb\\tsFileSpecial.tsfile");
//        System.out.println(b);
//    }
public static void main(String[] args) {
    long time = System.currentTimeMillis();// 示例毫秒数
    String timeFormat1 = "HH:mm:ss"; // 定义时间格式
    String timeFormat2 = "yyyy/MM/dd"; // 定义时间格式
    String timeFormat3 = "yyyy-MM-dd"; // 定义时间格式
    String timeFormat4 = "HH:mm:ss.SSS"; // 定义时间格式
    ZoneId zoneId = ZoneId.systemDefault(); // 使用系统默认时区x

    ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(time), zoneId);
    DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern(timeFormat1);
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern(timeFormat2);
    DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern(timeFormat3);
    DateTimeFormatter formatter4 = DateTimeFormatter.ofPattern(timeFormat4);
    String formattedDate1 = zonedDateTime.format(formatter1);
    String formattedDate2 = zonedDateTime.format(formatter2);
    String formattedDate3 = zonedDateTime.format(formatter3);
    String formattedDate4 = zonedDateTime.format(formatter4);

    System.out.println("Formatted Date: " + formattedDate1);
    System.out.println("Formatted Time: " + formattedDate2);
    System.out.println("Formatted TimeS: " + formattedDate3);
    System.out.println("Formatted TimeS: " + formattedDate4);
}

    /**
     * 解析CSV文件
     *
     * @param csvPath ： 文件存储的地址
     * @return : 解析后的数据集
     * @throws IOException
     */
    public static List<TsFileEntity> parseCSV(String csvPath) throws IOException {
        System.out.println("开始解析数据");
        List<TsFileEntity> objList = new ArrayList<>();
        //1、路径不存在或者文件不存在就直接返回去
        if (csvPath == null || !new File(csvPath).exists()) {
            return objList;
        }
        //2、解析CSV
        try (CSVParser parser = CSVParser.parse(new FileReader(csvPath), CSVFormat.DEFAULT.withHeader())) {
            //2.1、解析的每一行记录
            List<String> headerNames = parser.getHeaderNames();
            HeaderName = headerNames;
            for (CSVRecord csvRecord : parser) {
                // 假设CSV格式为：时间戳, 设备ID, 测量点, 值
                // 访问 CSV 记录的数据
                String timestamp = csvRecord.get(headerNames.get(0));
                double value = Double.parseDouble(csvRecord.get(headerNames.get(1)));
                //2.2、封装成实体类
                TsFileEntity tsFileEntity = TsFileEntity.builder()
                        .timeStamp(timestamp)
                        .value(value)
                        .build();
                //2.3、加入到集合
                objList.add(tsFileEntity);
            }
        }
        System.out.println("解析完成");
        //3、返回
        return objList;
    }

    /**
     * 将解析出来的数据转换成TsFile文件并存储到指定的位置
     *
     * @param objList    : 数据集
     * @param tsFilePath ： 存储TsFile的位置
     * @return
     */
    public static boolean readCSVToWriteTsFile(List<TsFileEntity> objList, List<String> HeaderName, String tsFilePath) {
        //转换成功或失败直接返回
        return TsFileWriteWithTSRecord.writeFileToTsFile(objList, HeaderName, tsFilePath);
    }
}